package Adaptadores;

import java.util.ArrayList;

import com.example.tdam_2012_g3.R;

import Persistencia.CreadorBD;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.preference.PreferenceManager;
import android.provider.ContactsContract;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.QuickContactBadge;
import android.widget.TextView;
import android.widget.Toast;
import entidades.ContactoAndroid;
import entidades.ShellSort;
import android.widget.Filter;

public class AdaptadorListaContactos extends BaseAdapter implements Filterable {
	private ArrayList<ContactoAndroid> listaContactos;
	private LayoutInflater inflater;
	private QuickContactBadge contactBadge;
	private ContactoFilter filtro;
	private Context context;
	private CreadorBD base;
	private ContactoAndroid contacto;
	private HolderContactos hContacto;

	public AdaptadorListaContactos(Context context) {
		this.context = context;
		listaContactos = new ArrayList<ContactoAndroid>();
		inflater = LayoutInflater.from(context);
		hContacto = new HolderContactos();
		base = new CreadorBD(context);
	}

	public void limpiar() {
		listaContactos.clear();
	}

	public void agregarContacto(ContactoAndroid contacto) {
		if (contacto != null)
			this.listaContactos.add(contacto);

	}

	public int getCount() {
		return listaContactos.size();

	}

	public Object getItem(int posicion) {
		return listaContactos.get(posicion);
	}

	public long getItemId(int posicion) {
		return posicion;
	}

	public View getView(int position, View convertView, ViewGroup parent) {
		Holder holder;
		if (convertView == null) {
			convertView = inflater.inflate(	com.example.tdam_2012_g3.R.layout.lista_contacto_items,null);
			holder = new Holder();
			holder.txtName = (TextView) convertView.findViewById(com.example.tdam_2012_g3.R.id.txtNombreContacto);
			holder.webSmsImage = (ImageView) convertView.findViewById(com.example.tdam_2012_g3.R.id.imgWebSmsPrincipal);
			convertView.setTag(holder); 
		} else {
			holder = (Holder) convertView.getTag();
		}
		contacto = (ContactoAndroid) getItem(position);
		holder.txtName.setText(contacto.toString());
		holder.txtName.setTag(position);
		holder.webSmsImage.setTag(position);
		holder.txtName.setOnClickListener(capturarClickEnNombre);
		holder.webSmsImage.setOnClickListener(captureWebImage);
		Uri contactUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI, contacto.getId());
		contactBadge = (QuickContactBadge) convertView.findViewById(com.example.tdam_2012_g3.R.id.qcbContactos);
		contactBadge.assignContactUri(contactUri);
		return convertView;
	}

	class Holder {
		private TextView txtName;
		private ImageView webSmsImage;

	}

	class HolderContactos {
		private ArrayList<ContactoAndroid> listaContactosCompleta;
	}
/**
 * Metodo que lee la preferencia de ordenamiento de los contactos y llama al sort corespondiente
 * @param preference: true ascendente; false descendente
 */
	public void sortContactos(boolean preference) {
		ShellSort sort = new ShellSort();
		if (preference == true) {
			listaContactos = sort.doSortAscending(listaContactos);
		} else
			listaContactos = sort.doSortDescending(listaContactos);

	}

	OnClickListener capturarClickEnNombre = new OnClickListener() {
		public void onClick(View view) {
			Intent intento = new Intent(context,com.example.tdam_2012_g3.Activity_Contactos.class);
			ContactoAndroid cont = (ContactoAndroid) getItem((Integer) view.getTag());
			intento.putExtra("id_contacto", cont.getId());
			context.startActivity(intento);
		}

	};
	OnClickListener captureWebImage = new OnClickListener() {

		public void onClick(View view) {
			if (readIsConnected()) {
				Intent intento = new Intent(context,com.example.tdam_2012_g3.Activity_MsjServidor.class);
				ContactoAndroid cont = (ContactoAndroid) getItem((Integer) view.getTag());
				String id = cont.getId();
				if (base.estaAsociado(id)) {
					intento.putExtra("id_contacto", id);
					context.startActivity(intento);
				} else {
					showToast(context.getString(R.string.str_contacto_no_asociado)).show();
				}
			} else {
				showToast(context.getString(R.string.str_no_hay_conexion)).show();
			}

		}

	};

	
	public Filter getFilter() {
		if (filtro == null) {
			filtro = new ContactoFilter();
		}
		return filtro;
	}
/**
 * este metodo se llama de afuera para tener una copia de la lista de contactos
 */
	public void mantenerLista() {
		hContacto.listaContactosCompleta = listaContactos;
	}
	
	/**
	 * lee la preferencia isConnected y devuelve su resultado
	 * @return el valor de la preferencia
	 */
		public boolean readIsConnected() {
			SharedPreferences myPreference = PreferenceManager.getDefaultSharedPreferences(context);
			return myPreference.getBoolean("connected", false);

		}
		
	/**
	 * Muestra un toast
	 * @param mensaje: texto a mostrar en el toast
	 * @return el toast a mostrar
	 */
		public Toast showToast(String mensaje) {
			Toast toast = Toast.makeText(context, mensaje, Toast.LENGTH_LONG);
			return toast;
		}

	/**
	 * Clase interna que extiende de filter, aca ira la logica del filtrado de
	 * contactos
	 */
	public class ContactoFilter extends Filter {
		
		/**
		 * Toma el input del usuario y carga una nueva lista con los contactos que pasan el filtro
		 * @param constraint secuencia introducida por el usuario para filtrar si es nula no se crea una nueva lista
		 */
		@Override
		protected FilterResults performFiltering(CharSequence constraint) {
			FilterResults results = new FilterResults();
			if (constraint == null || constraint.length() == 0) { 
				results.values = hContacto.listaContactosCompleta;
				results.count = listaContactos.size();
			}
			else {
				ArrayList<ContactoAndroid> contactoFiltrado = new ArrayList<ContactoAndroid>();
				for (ContactoAndroid ca : hContacto.listaContactosCompleta) {
					if (ca.getNombre().toLowerCase().startsWith(constraint.toString().toLowerCase()))
						contactoFiltrado.add(ca); 
				results.values = contactoFiltrado;
				results.count = contactoFiltrado.size();
			}
			}
			return results;
		}

		/**
		 *  Publica los resultados del filtro para que se reflejen en la lista de contactos
		 */
	
		@Override
		protected void publishResults(CharSequence constraint,
				FilterResults results) {
			if (results.count == 0) {
				notifyDataSetInvalidated();
			} else {
				if (((ArrayList<ContactoAndroid>) results.values).size() < hContacto.listaContactosCompleta.size()) {
					listaContactos = (ArrayList<ContactoAndroid>) results.values; 
					notifyDataSetChanged();

				} else {
					listaContactos = hContacto.listaContactosCompleta;
					notifyDataSetChanged();
				}
			}
		}
	}
	
	public void filtroCasero(CharSequence s){
		
	}


}
